package cn.tedu.baking.controller;

import cn.tedu.baking.aop.RequiredLog;
import cn.tedu.baking.mapper.UserMapper;
import cn.tedu.baking.pojo.dto.UserLoginDTO;
import cn.tedu.baking.pojo.dto.UserRegDTO;
import cn.tedu.baking.pojo.dto.UserUpdateDTO;
import cn.tedu.baking.pojo.entity.User;
import cn.tedu.baking.pojo.vo.UserVO;
import cn.tedu.baking.response.JsonResult;
import cn.tedu.baking.response.StatusCode;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.util.Date;

/**
 * 用于处理用户请求的控制器类
 */
@RestController
@RequestMapping("/v1/users/")
@Api(tags = "1.用户模块")
public class UserController {
    @Autowired
    UserMapper userMapper;
    /**
     *  entity  实体类:  跟数据库中的表做映射关系 更好的实现对数据库的操作
     *  VO      实体类:  后端用于返回给前端的数据用于封装的类
     *  DTO     实体类:  用于后端接收前端请求参数的数据而封装的类
     */
    @PostMapping("reg")
    @ApiOperation(value = "注册功能")
    public JsonResult reg(@RequestBody UserRegDTO userRegDTO){
        /**
         *  需要先根据传递过来的用户名,查询用户表中是否存在该用户
         *   如果存在  返回用户名已存在的状态码
         *   否则 正常插入数据
         */
        UserVO userVO = userMapper.selectUserByUserName(userRegDTO.getUserName());
        if(userVO != null){
            return new JsonResult(StatusCode.USERNAME_ALREADY_EXISTS);//返回用户名已存在码
        }
        User user = new User();
        BeanUtils.copyProperties(userRegDTO,user);//1.拷贝的源数据   2. 拷贝到的目标数据
        user.setCreateTime(new Date());//设置用户创建时间
        userMapper.insertUser(user);
        return JsonResult.ok();
    }
    @PostMapping("login")
    @ApiOperation(value = "登录功能")
    public JsonResult login(@RequestBody UserLoginDTO userLoginDTO, @ApiIgnore HttpSession session){
        /**
         *  根据请求中的用户 在表中查询 是否存在
         *    如果存在, 用查询出的记录中的密码 再次与请求中的密码 做判断
         *            密码正确,返回登录成功   否则  密码错误
         *    如果不存在,返回用户名错误
         */
        UserVO userVO = userMapper.selectUserByUserName(userLoginDTO.getUserName());
        if(userVO != null){
            if(userVO.getPassword().equals(userLoginDTO.getPassword())){
                //服务端存储当前登录的用户,以便于后续访问其他页面时,可以校验用户的登录状态.
                session.setAttribute("user",userVO);
                return JsonResult.ok(userVO);//将对象返回给页面进行存储
            }else {
                return new JsonResult(StatusCode.PASSWORD_ERROR);//密码错误
            }
        }
        return new JsonResult(StatusCode.USERNAME_ERROR);//用户名错误
    }

    @GetMapping("logout")
    @ApiOperation(value = "登出功能")
    public JsonResult logout(HttpSession session){
        session.removeAttribute("user");//将该客户端访问时记录的session对象清除掉
        return JsonResult.ok(null);//将页面存储的对象清除
    }

    @PostMapping("update")
    @ApiOperation(value = "更新功能")
    public JsonResult update(@RequestBody UserUpdateDTO userUpdateDTO){
        //更新的业务
        //1.先通过传入的userUpdateDTO 中的imgurl,判断是否不为null
        //  如果不为null,查询一下当前要修改头像的用户 的表中img_url是否有路径
        if(userUpdateDTO.getImgUrl() != null){ //如果不为null 说明此次更新包含头像更新
            //先查到此次要更新头像的用户记录中旧的头像路径
            String imgUrl = userMapper.selectImgUrlById(userUpdateDTO.getId());
            //imgUrl 如果是null ,下面这行代码不会删除成功, 如果有,那就把旧头像删除
            new File("d:/file"+imgUrl).delete();
        }
        User user = new User();
        BeanUtils.copyProperties(userUpdateDTO,user);
        userMapper.updateUserById(user);
        return JsonResult.ok();
    }

    @GetMapping("")
    @ApiOperation(value = "查询所有用户功能")
    public JsonResult selectAll(){

//         return list;
        return JsonResult.ok(userMapper.selectAllUser());
    }

    @PostMapping("{id}/{isAdmin}/change")
    @ApiOperation(value = "修改管理员功能")
    @ApiImplicitParams(
            value = {
                    @ApiImplicitParam(name = "id",value = "用户id",dataType = "long",required = true),
                    @ApiImplicitParam(name = "isAdmin",value = "是否是管理员(0F/1T)",dataType = "long",required = true)
            }
    )
    @RequiredLog(value = "修改管理员的动作")
    public JsonResult change(@PathVariable Long id,
                             @PathVariable Integer isAdmin){
        User user = new User();
        user.setId(id);
        user.setIsAdmin(isAdmin);
        userMapper.updateUserById(user);
        return JsonResult.ok();
    }


    //根据后台管理页面的 删除按钮,可以自行实现  将删除 用户的操作 实现.
    @PostMapping("{id}/delete")
    @ApiImplicitParam(name = "id",value = "用户id",dataType = "long",required = true)
    public JsonResult delete(@PathVariable Long id){
        userMapper.deleteUserById(id);
        return  JsonResult.ok();
    }

}
